---
--- Created by hhbo.
--- DateTime: 2024/7/12 17:31
---
--- -1 failed
--- 1 success

-- releaseLock key
local key = KEYS[1]
local requestId = KEYS[2]
local ttl = tonumber(KEYS[3])
-- 若锁不存在：则直接返回1
if (redis.call('exists', key) == 0) then
    return 1;
end;

-- 若锁存在，但唯一标识不匹配：则表明锁被其他线程占用，当前线程不允许解锁其他线程持有的锁
if (redis.call('hexists', key, requestId) == 0) then
    return -1;
end;

-- 若锁存在，且唯一标识匹配：则先将锁重入计数减1，不存在时会返回-1
local counter = redis.call('hincrby', key, requestId, -1);
if (counter > 0) then
    -- 锁重入计数减1后还大于0：表明当前线程持有的锁还有重入，不能进行锁删除操作，但可以友好地帮忙设置下过期时期
    if (ttl > 0) then
            redis.call('pexpire', key, ttl);
    end;
    return 0;
else
    -- 锁重入计数已为0：间接表明锁已释放了。直接删除掉锁
    redis.call('del', key);
    return 1;
end;

return nil;
